package collection;


/*
* 需求: *   定义一个集合,向集合中添加三个字符串 "abc" "def" "ghk"
*   删除ghk元素,最终容器中只有"abc","def"
*
* 问题:java.util.ConcurrentModificationException(并发修改异常)
*   由于我们在使用迭代器的方法遍历的过程中,使用了集合的方法 删除/添加
*   从而造成了并发修改异常
*
*   多线程访问共享数据安全问题
*   迭代器操作 比喻 张三操作
*   集合操作 比喻 李四操作
*   张三和李四的操作是相互独立的(隔离),张三和李四一人代表一个线程
*   类比:张三在迭代集合中的数据时,李四删除了集合中的一个元素,但是张三并不知道,张三还以为迭代的是原来集合中的数据和结果,因此会出现问题
*  java为了避免出现这种问题,就会抛出并发修改异常,提前结束程序
*
* 解决方案
*   如果使用迭代器的方式进行遍历,在遍历过程中需要针对集合进行添加/删除元素的操作,需要使用迭代器的方法来完成
*   避免并发修改异常
*
*   如果使用集合的方式进行遍历,在遍历过程中需要针对集合进行添加/删除元素的操作,需要使用集合的方法来完成
*   避免并发修改异常
*
* */
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo05 {
    public static void main(String[] args) {
        //method01();
        Collection c = new ArrayList();
        c.add("abc");
        c.add("def");
        c.add("ghk");

        //1.定义一个迭代器
        Iterator iterator = c.iterator();

        //2.逐个迭代集合中的元素
        while(iterator.hasNext()){
            Object element = iterator.next();
            //3.遍历到ghk时把他删除
            if (element.equals("ghk")) {
                //c.remove(element);
                iterator.remove();//删除当前迭代的元素
            }
        }
        System.out.println(c);
    }

    private static void method01() {
        Collection c = new ArrayList();
        c.add("abc");
        c.add("def");
        c.add("ghk");

        //1.定义一个迭代器
        Iterator iterator = c.iterator();

        //2.逐个迭代集合中的元素
        while(iterator.hasNext()){
            Object element = iterator.next();
            //3.遍历到ghk时把他删除
            if (element.equals("ghk")) {
                c.remove(element);
            }
        }
        System.out.println(c);
    }
}
